/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hibernate;

import beans.Usuario;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.exception.SQLGrammarException;

/**
 *
 * @author Antonio
 */

/*
 * 
 * Clase destinada a iniciar la sesion para una clase bean determinada. 
 */
public class PreparacionHibernate {

    private Configuration configuracion = null;
    protected  SessionFactory sesionFactoria = null;
    private Session sesion = null;
    public String resource;
    private Object correoUsuario;

    /**Construye y devuelve una Configuration*/
    public Configuration getConfiguracion() {


        if (configuracion == null) {
            configuracion = new Configuration();
        }
        return configuracion;
    }

    /**Construye y devuelve una Session*/
    public Session getSesion() {

        if (sesion == null || !sesion.isOpen()) {
            try {
                sesion = getSesionFactoria().openSession();
            } catch (HibernateException he) {
            }
        }

        return sesion;
    }

    /**Construye y devuelve una SessionFactory*/
    public SessionFactory getSesionFactoria() {

        if (sesionFactoria == null) {
            try {
                sesionFactoria = getConfiguracion().configure().buildSessionFactory();
            } catch (HibernateException e) {
                int a;
                String s = e.getMessage();
            }
        }

        return sesionFactoria;
    }

    /**Devuelve un boolean indicando si existe algun valor en la base de datos
     para la consulta y la coleccion de obejetos dada
     * @param String : consulta
     * @param Hashtable : parametros de la consulta
     * @return boolean : true si la consulta devuelve algun valor
     * false en otro caso. 
     */
    public boolean existeEn(String query, Hashtable<String, Object> dic) 
    {

        boolean res = false;
        Usuario user;
        Session s = getSesion();


        if (s == null) {
        } else {
            Transaction trans = null;
            try {
                trans = s.beginTransaction();
                Query consulta = s.createQuery(query);
                for (String cad : dic.keySet()) {
                    consulta.setParameter(cad, dic.get(cad));
                }
                
                res = !(consulta.list().isEmpty());
                trans.commit();

            } catch (SQLGrammarException he) {
                if (trans != null) {
                    try {
                        trans.rollback();
                    } catch (HibernateException he2) {
                    }
                }
            } catch (Exception e) {
                String cadena = e.getMessage();
            } finally {
                try {
                    s.close();
                } catch (HibernateException he3) {
                }
            }
            
        }
        return res;


    }
    /**Devuelve una lista con los  valores en la base de datos
     para la consulta y la coleccion de objetos dada
     * @param String : consulta
     * @param Hashtable : parametros de la consulta
     * @return List : valores devueltos por la consulta 
     */
    public List<Object> devuelveDatos(String query, Hashtable<String, Object> dic) 
    {

        List<Object> res = new ArrayList<Object>();
        Session s = getSesion();
        
        if (s == null) {
        } else {
            Transaction trans = null;
            try {
                trans = s.beginTransaction();
                Query consulta = s.createQuery(query);
                for (String cad : dic.keySet()) {
                    consulta.setParameter(cad, dic.get(cad));
                }
                
                res = consulta.list();
                trans.commit();

            } catch (HibernateException he) {
                if (trans != null) {
                    try {
                        trans.rollback();
                    } catch (HibernateException he2) {
                    }
                }
            } catch (Exception e) {
                String cadena = e.getMessage();
            } finally {
                try {
                    s.close();
                } catch (HibernateException he3) {
                }
            }
            
        }
        return res;


    }
    /**Añade en la base de datos un objeto generico
     * @param Object : objeto que se quiere añadir
     */
    public void anadirEnBD(Object obj)
    {
        Session s = getSesion();
        if (s == null)
        {
            
        }
        else
        {
            Transaction trans = null;
            try
            {
                trans = s.beginTransaction();
                s.save(obj);
                trans.commit();
            }
            catch(HibernateException he)
            {
                if (trans != null)
                {
                    try
                    {
                        trans.rollback();
                    }
                    catch (HibernateException he2)
                    {}
                }
            }
            finally
            {
                try 
                {
                    s.close();
                }
                catch(HibernateException he3)
                {}
            }
        }
    }
    
    /**Recupera de la base de datos un objeto generico dado por su id
     * @param Object : objeto que se quiere recuperar
     * @param long : id del objeto
     */
    public Object load (Object object, long id)
    {
        Object resultado = null;
        Session s = getSesion();
        
        if (s == null) {
        } else {
            Transaction trans = null;
            try {
                trans = s.beginTransaction();
                resultado = s.load(object.getClass(), id);
                trans.commit();

            } catch (HibernateException he) {
                if (trans != null) {
                    try {
                        trans.rollback();
                    } catch (HibernateException he2) {
                    }
                }
            } catch (Exception e) {
                String cadena = e.getMessage();
            } finally {
                try {
                    s.close();
                } catch (HibernateException he3) {
                }
            }
            
        }
        return resultado;

    }
}
